package design_pattern.WaitingRequestQueue;

import java.util.Random;

/**
 * @Author: 蔡翔
 * @Date: 2019/11/9 20:02
 * @Version 1.0
 */
public class ServerThread extends Thread {
    private final RequestQueue requestQueue;
    private final Random random;
    private volatile boolean flag = false;

    public ServerThread(RequestQueue requestQueue){
        this.requestQueue = requestQueue;

        this.random = new Random(System.currentTimeMillis());
    }

    @Override
    public void run() {
        while (!flag){
            //模拟一直去 任务队列取任务
            //如果没有任务就会被 wait住 等待被唤醒。
            //问题：如果requestQueue.getRequest() 被wait住了，那是判断不到 我这边新设置 flag = false的。
            Request request = requestQueue.getRequest();
            if(request == null){
                System.out.println("Received the empty request");
                break;
            }
            System.out.println("Server -> "+request.getValue());
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                //如果想人物 到这一步，那么只要在其他地方 把这个线程打断掉就行了
                return;
            }
        }
    }
    public void close(){
        this.flag = true;
        // 制造异常，跳出run 方法。注意这里有一个很巧的地方就是，这里打断的是this是ServerThread，RequestQueue仍然是this里面的，当程序执行到
        // RequestQueue的 wait() 方法了，阻塞的是ServerThread线程，所以这个时候如果打断ServerThread，是会被RequestQueue类捕捉的。
        this.interrupt();
    }
}
